package com.managertrade.common;

import java.util.concurrent.*;

public enum ThreadPoolEnum {
    /**
     * 单线程池（FIFO 顺序执行，保证任务一个一个执行）
     */
    SINGLE_THREAD_POOL(
            new ThreadPoolExecutor(
                    1, // 核心线程数
                    1, // 最大线程数
                    0L, TimeUnit.MILLISECONDS, // 空闲线程存活时间
                    new LinkedBlockingQueue<>(1000), // 有界队列，最多1000任务等待
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy() // 拒绝策略：直接抛出异常
            )
    ),
    PREDICT_SINGLE_THREAD_POOL(
            new ThreadPoolExecutor(
                    1, // 核心线程数
                    1, // 最大线程数
                    0L, TimeUnit.MILLISECONDS, // 空闲线程存活时间
                    new LinkedBlockingQueue<>(1000), // 有界队列，最多1000任务等待
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy() // 拒绝策略：直接抛出异常
            )
    ),
    CACHE_SINGLE_THREAD_POOL(
            new ThreadPoolExecutor(
                    1, // 核心线程数
                    1, // 最大线程数
                    0L, TimeUnit.MILLISECONDS, // 空闲线程存活时间
                    new LinkedBlockingQueue<>(1000), // 有界队列，最多1000任务等待
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy() // 拒绝策略：直接抛出异常
            )
    ),

    /**
     * 多线程池（根据CPU核心数创建，适合并行任务）
     */
    MULTI_THREAD_POOL(
            new ThreadPoolExecutor(
                    Runtime.getRuntime().availableProcessors(), // 核心线程数
                    Runtime.getRuntime().availableProcessors() * 2, // 最大线程数
                    60L, TimeUnit.SECONDS, // 空闲线程保留时间
                    new LinkedBlockingQueue<>(2000), // 有界队列
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.CallerRunsPolicy()
                    // 拒绝策略：由调用线程自己执行任务（防止丢任务）
            )
    );

    private final ExecutorService executor;

    ThreadPoolEnum(ExecutorService executor) {
        this.executor = executor;
    }

    public ExecutorService getExecutor() {
        return executor;
    }
}

